package org.haredot.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.haredot.entity.Func;
import org.haredot.mapper.FuncMapper;
import org.haredot.service.FuncService;
import org.haredot.vo.PageVo;
import org.haredot.vo.ResultVo;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Objects;

@Service
@Transactional(rollbackFor = Exception.class)
public class FuncServiceImpl implements FuncService {

    @Resource
    private FuncMapper funcMapper ;

    @Override
    public ResultVo<Func> saveFunc(Func func) {
        // 根据 功能名，查找功能是否已经存在
        Func f = funcMapper.findByName(func.getName());

        if (f !=null) {
            return ResultVo.<Func>fail("功能名已经存在").build();
        }

        f  = funcMapper.findByRemark(func.getRemark()) ;

        if (f !=null) {
            return ResultVo.<Func>fail("权限标识已存在").build() ;
        }

        funcMapper.insert(func);

        return ResultVo.<Func>ok().data(func).build();
    }

    @Override
    public ResultVo<PageVo<Func>> queryFuncsList(PageVo<Func> pageVo) {

        PageInfo<Func> info = PageHelper.startPage(pageVo)
                .doSelectPageInfo(() -> funcMapper.findAll(pageVo.getParams()));

        pageVo.setTotal(info.getTotal()).setList(info.getList());

        return ResultVo.<PageVo<Func>>ok().data(pageVo).build();
    }

    @Override
    public ResultVo<Func> modifyFunc(Func func) {
        // 查询 功能名是否已经存在、
        Func f = funcMapper.findByName(func.getName());

        if (f !=null && !Objects.equals(f.getId(), func.getId())) {
            return ResultVo.<Func>fail("功能名已经存在").build();
        }

        f = funcMapper.findByRemark(func.getRemark()) ;

        if (f !=null && !Objects.equals(f.getId(), func.getId())) {
            return ResultVo.<Func>fail("权限标识已存在").build() ;
        }
        // 将数据进行更新
        funcMapper.updateByPrimaryKey(func);

        return ResultVo.<Func>ok().data(func).build();
    }

    @Override
    public ResultVo<?> removeFunc(Long funcId) {

        int len = funcMapper.removeById(funcId) ;

        return ResultVo.asserts(len == 1, "删除失败").build();
    }
}
